"""
将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：

P   A   H   N |  A   A   A
A P L S I I G | / \ / \ / \
Y   I   R     V    V   V
"""

from operator import index

#
class Solution:
    def convert(self, s: str, numRows: int) -> str:
        lin=[["" for i in range(len(s))] for _ in range(numRows)]
        hang=0
        lie =0
        flag = 0  # 标记插入方向，0向下，1向上
        for i in range(len(s)):
            if numRows ==1:
                return s
            if flag == 1: #列数向右移动一格
                lie += 1
            lin[hang][lie] = s[i]
            if flag == 0:#如果方向向下
                hang += 1
            else:
                hang -= 1
            if hang == numRows: #如果到达最下方
                hang = numRows-2 #调整行数到倒数第二行
                flag = 1    #同时改变插入方向，向上插入
            if hang == -1:  #如果到达第0行
                hang = 1  #调整行数到第一行
                flag = 0  #改变插入方向

        return ''.join([''.join(row) for row in lin])
#
#
# class Solution:
#     def convert(self, s: str, numRows: int) -> str:
#         if numRows == 1 or numRows >= len(s):
#             return s
#
#         lin = [[] for _ in range(numRows)]
#         hang = 0
#         flag = 0  # 0 表示向下，1 表示向上
#
#         for char in s:
#             # 将字符添加到当前行
#             lin[hang].append(char)
#
#             # 移动方向判断
#             if flag == 0:
#                 hang += 1
#             else:
#                 hang -= 1
#
#             # 到底了，转向
#             if hang == numRows:
#                 hang = numRows - 2
#                 flag = 1
#             # 到顶了，再转向
#             elif hang == -1:
#                 hang = 1
#                 flag = 0
#
#         # 合并所有行的结果
#         return ''.join([''.join(row) for row in lin])

z = Solution()
print(z.convert("PAYPALISHIRING",3))